package com.bjpowernode.jdbc;

import com.mysql.jdbc.Driver;

import java.sql.*;
import java.util.HashMap;
import java.util.Scanner;

/*
实现功能：
    1、需求：
        模拟用户登录功能的实现。
    2、业务描述：
        程序运行的时候，提供一个输入的入口，可以让用户输入用户名和密码
        用户输入用户名和密码之后，提交信息，java程序收集到用户信息
        Java程序连接数据库验证用户名和密码是否合法
        合法：显示登录成功
        不合法：显示登录失败
    3、数据的准备：
        在实际开发中，表的设计会使用专业的建模工具，我们这里安装一个建模工具：PowerDesigner
        使用PD工具来进行数据库表的设计。（参见user-login.sql脚本）
    4、当前程序存在的问题：
        用户名：fdsa
        密码：fdsa' or '1'='1
        登录成功
        这种现象被称为SQL注入(安全隐患)。（黑客经常使用）
    5、导致SQL注入的根本原因是什么？
        用户输入的信息中含有sql语句的关键字，并且这些关键字参与sql语句的编译过程，
        导致sql语句的原意被扭曲，进而达到sql注入。
*/

public class JDBCTest6 {
    public static void main(String[] args) {
        //初始化界面
        HashMap<String, String> hm = InitView();
        //进行登录，根据返回值进行判断是成功还是失败
        boolean result = login(hm);
        //判断结果
        System.out.println(result ? "登录成功" : "登录失败");
    }

    /*
     * 作用：判断是否登录成功
     * 参数：用户的信息
     * 返回值：是否登录成功
     * */
    private static boolean login(HashMap<String, String> hm) {
        //获取集合中的登录信息
        String loginName = hm.get("loginName");
        String loginPwd = hm.get("loginPwd");

        //登录标记
        boolean loginSuccess = false;

        //数据库的连接
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/bjpowernode", "root", "246810");
            //3.获取数据库操作对象
            stmt = conn.createStatement();
            //4.执行sql语句
            String sql = "select * from t_user where loginName = '" + loginName + "' and loginPwd = '" + loginPwd + "'";
            // 以上正好完成了sql语句的拼接，以下代码的含义是，发送sql语句给DBMS，DBMS进行sql编译。
            // 正好将用户提供的“非法信息”编译进去。导致了原sql语句的含义被扭曲了。
            rs = stmt.executeQuery(sql);
            //5.处理查询结果集
            if (rs.next()) {
                loginSuccess = true;
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //6.释放资源
        }
        return loginSuccess;
    }

    /*
     * 作用：收集用户名的信息
     * 返回值：用户名的信息
     * */
    private static HashMap<String, String> InitView() {
        Scanner sc = new Scanner(System.in);
        System.out.print("用户名：");
        String loginName = sc.nextLine();
        System.out.print("密码：");
        String loginPwd = sc.nextLine();
        HashMap<String, String> hm = new HashMap<>();
        hm.put("loginName", loginName);
        hm.put("loginPwd", loginPwd);
        return hm;
    }
}
